00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef DDIRECT3D_HPP
00037 #define DDIRECT3D_HPP
00038
00039
00040
00041
00042 #pragma comment(lib, "d3dx9")
00043
00044 #define DEDRIVER_DLL_EXPORTS
00045 #define USING_DESTINY3D
00046
00047
00048 #include <d3d9.h>
00049 #include "Destiny3D.hpp"
00050 #include "deGlobalTypes.hpp"
00051
00052
00053 #include "deDriver_priv.hpp"
00054
00055 #include "deHash.hpp"
00056 #include "deList.hpp"
00057
00058 static const long deD3D9_MAX_LIGHTS = 8;
00059
00060
00061 class deDirect3D9 : public deDriver
00062 {
00063 public:
00064
00065 deDirect3D9(long ID);
00066 ~deDirect3D9();
00067 long Release();
00068 deBoolean Init(HWND WindowHandle);
00069
00070
00071 const deDriverCaps* GetCaps(long Adapter) const;
00072 long GetAdapterCount() const;
00073 long GetModeCount(long Adapter) const;
00074 deBoolean WindowedAllowed(long Adapter) const;
00075
00076
00077 deBoolean SetDisplay(deDisplay *Display);
00078 deBoolean Reset(deDisplay *Display = NULL);
00079 deBoolean GetCurrentDisplay(long Adapter, deDisplay * Display) const;
00080 deBoolean GetDisplayMode(long Adapter, long Mode, deDisplay *Display) const;
00081 deBoolean ValidFormat(long Adapter, Resource ResourceType, BPP BPPType, ZPP ZPPType, BPP FrontBuffer, long ExtraFlag) const;
00082
00083
00084 deBoolean AddVertexBuffer(IdeVertexBuffer *Vertex);
00085 deBoolean RemoveVertexBuffer(IdeVertexBuffer *Vertex);
00086 deBoolean UpdateVertexBuffer(IdeVertexBuffer *Vertex);
00087
00088
00089 deBoolean AddShader(IdeShader * Shader);
00090 deBoolean SetShader(IdeShader * Shader);
00091 deBoolean RemoveShader(IdeShader * Shader);
00092
00093
00094 deBoolean BeginFrame();
00095 deBoolean EndFrame();
00096 deBoolean ClearFrame(deARGB Color, deBoolean ClearTarget, deBoolean ClearZBuffer, deBoolean ClearStencil);
00097 deBoolean Render(IdeVertexBuffer *Vertex, long IndexOffset, IdeVertexBuffer *IndexOverride);
00098
00099
00100 deBoolean SetViewport(long X, long Y, long Width, long Height, float MinZ, float MaxZ);
00101 deBoolean SetDepthRange(deFloat MinZ, deFloat MaxZ);
00102 deBoolean SetFOVClipping(float FOVY, float Aspect, float ClipNear, float ClipFar);
00103 deBoolean SetOrthoClipping(float Width, float Height, float ClipNear, float ClipFar, deBoolean Invert);
00104 deBoolean SetFOVClippingSubRect(deFloat FOVY, deFloat Aspect, deFloat ClipNear, deFloat ClipFar, deRect SubRect);
00105 deBoolean SetFOVClippingSubRectFloat(deFloat FOVY, deFloat Aspect, deFloat ClipNear, deFloat ClipFar, deFloatRect SubRect);
00106 deBoolean SetOrthoClippingSubRect(deFloat Width, deFloat Height, deFloat ClipNear, deFloat ClipFar, deBoolean Invert, deRect SubRect);
00107 deBoolean SetOrthoClippingSubRectFloat(deFloat Width, deFloat Height, deFloat ClipNear, deFloat ClipFar, deBoolean Invert, deFloatRect SubRect);
00108 deBoolean SetScissorRect(deRect ScissorRect);
00109
00110
00111 deBoolean SetCameraTransform(deTransformInfo *M);
00112 deBoolean SetCameraTransform(deVertex *Eye, deVertex *At, deVertex *Up);
00113 deBoolean SetCameraTranslation(deVertex *Translation);
00114 deBoolean SetCameraRotation(deVertex *Rotation);
00115 deBoolean ResetCameraIdentity();
00116
00117
00118 deBoolean SetWorldTransform(deTransformInfo * Mat);
00119 deBoolean SetWorldTransform(deVertex *Eye, deVertex *At, deVertex *Up);
00120 deBoolean SetWorldTranslation(deVertex *Translation);
00121 deBoolean SetWorldRotation(deVertex *Rotation);
00122 deBoolean ResetWorldIdentity();
00123
00124 deBoolean SetTextureTransform(long StageNum, deTransformInfo * Mat);
00125
00126
00127 deBoolean AddBitmap(IdeBitmap *Bitmap);
00128 deBoolean AddBitmapProxy(IdeBitmapProxy *BitmapProxy);
00129 deBoolean RemoveBitmap(IdeBitmap *Bitmap);
00130
00131
00132 deBoolean RenderTo(IdeBitmap *Bitmap, long CubeMapFace);
00133 deBoolean ScreenShot(IdeBitmap * &pBitmap, deBoolean GrabWindow);
00134 deBoolean GetVideoTexture(IdeBitmap* pBitmap, long CubeMapFace);
00135
00136
00137 unsigned long GetRenderState(RenderState State);
00138 deBoolean SetRenderState(const IdeRenderState *State);
00139 deBoolean SetRenderState(RenderState State, unsigned long Value);
00140 deBoolean EnableLight(long LightID, deBoolean Enable);
00141 deBoolean DisableAllLights();
00142
00143
00144 deDriverInfo* GetInfo() const;
00145 IdeDriver::Types GetType() const;
00146
00147 void InvalidateRenderStates(deBoolean Valid);
00148 private:
00149 struct VertexShaderEntry
00150 {
00151
00152
00153 IDirect3DVertexDeclaration9* StreamDecl;
00154
00155 long BufferFlags;
00156
00157 };
00158
00159 struct VertexBufferEntry
00160 {
00161 long ID;
00162 long EntrySize[IdeVertexBuffer::BUFFER_COUNT-1];
00163 LPDIRECT3DVERTEXBUFFER9 Buffers[IdeVertexBuffer::BUFFER_COUNT-1];
00164 LPDIRECT3DINDEXBUFFER9 IndexBuffer;
00165 D3DPRIMITIVETYPE RenderType;
00166 long PointCount;
00167 long TriCount;
00168 long IndexCount;
00169 long PointStart;
00170 long IndexStart;
00171 long FrameUsed;
00172 deBoolean SubBuffer;
00173 unsigned long* FVFShader;
00174 IDirect3DVertexDeclaration9* VertexDecl;
00175 };
00176
00177 struct TextureEntry
00178 {
00179 long ID;
00180 long NumFaces;
00181 long FrameUsed;
00182 LPDIRECT3DBASETEXTURE9 Texture;
00183 LPDIRECT3DSURFACE9 DepthStencil;
00184 };
00185
00186
00187 static long s_AdapterCount;
00188 static int * s_ModeCount;
00189 static deBoolean * s_WindowPossible;
00190 static HINSTANCE s_libD3D9;
00191 static LPDIRECT3D9 s_D3D;
00192 static D3DCAPS9 * s_DevCaps;
00193 static deDriverCaps* s_Caps;
00194 static long s_NumDevices;
00195 D3DDISPLAYMODE** s_DisplayModes;
00196
00197
00198 IDirect3DDevice9 * m_D3DDevice;
00199
00200
00201 deBoolean m_DeviceLost;
00202 deBoolean m_RenderStatesValid;
00203 deTList <VertexShaderEntry> m_ShaderList;
00204 VertexShaderEntry* m_LastShader;
00205 deBoolean m_TextureRendered;
00206 deBoolean m_LightsEnabled[deD3D9_MAX_LIGHTS];
00207 IdeRenderTexture* m_CachedTexture;
00208 long m_FrameNum;
00209
00210
00211 D3DMATRIX m_WorldMatrix;
00212 D3DMATRIX m_CameraMatrix;
00213
00214
00215 IdeRenderMaterial::MatSource_t m_AmbientSource, m_EmissiveSource;
00216 IdeRenderMaterial::MatSource_t m_DiffuseSource, m_SpecularSource;
00217 deTHashInt <IdeBitmap*> m_TexturesList;
00218 deTHashInt <IdeVertexBuffer*> m_VBufferList;
00219 LPDIRECT3DSURFACE9 m_pZBuffer;
00220 IdeBitmap* m_pCurrentTarget;
00221
00222
00223 void ReportErrorHR(HRESULT hr);
00224 deBoolean TestDeviceStatus(deBoolean * DeviceCanReset);
00225 deBoolean ResetDevice(D3DPRESENT_PARAMETERS *D3DParams);
00226 deBoolean ReleaseVideoMemResources();
00227 deBoolean BuildD3DParams(deDisplay * Display, D3DPRESENT_PARAMETERS *D3DParams);
00228
00229 deBoolean SetTextureState(IdeRenderTexture *State);
00230 deBoolean SetLightState(IdeRenderLight *State);
00231 deBoolean SetMaterialState(IdeRenderMaterial *State);
00232
00233 deBoolean FillBufferInfo(VertexBufferEntry *BufferEntry, IdeVertexBuffer *Vertex, IdeVertexBuffer::BufferType BufferType, deBoolean WipeBuffer);
00234 deBoolean ProcessVertexBuffer(IdeVertexBuffer *Vertex, VertexBufferEntry *VertexBufferInfo, long BufferFlags);
00235
00236 deBoolean CreateDefaultCachedTexture();
00237
00238
00239 VertexShaderEntry* GetFixedFunctionShader(IdeVertexBuffer *Vertex);
00240 VertexShaderEntry* LookUpVertexDeclaration(long BufferFlags) const;
00241 VertexShaderEntry* MakeVertexDeclaration(long BufferFlags);
00242 long DeleteShaders();
00243
00244 D3DFORMAT ToD3DBPP(IdeDriver::BPP BPPType) const;
00245 IdeDriver::BPP FromD3DBPP(D3DFORMAT BPPType) const;
00246 D3DFORMAT ToD3DZPP(IdeDriver::ZPP ZPPType) const;
00247 IdeDriver::ZPP FromD3DZPP(D3DFORMAT ZPPType) const;
00248 D3DMATERIALCOLORSOURCE ToD3DMatSource(IdeRenderMaterial::MatSource_t source) const;
00249 };
00250
00251 char* __cdecl HR2String(HRESULT hr, char* szHR);
00252
00253 extern "C"
00254 {
00255
00256 #ifdef _DEBUG
00257 __declspec(dllexport) deBoolean IsDestiny3DDriverDebug();
00258 #else
00259 __declspec(dllexport) deBoolean IsDestiny3DDriver();
00260 #endif
00261 __declspec(dllexport) IdeDriver *GetDriverInstance(long ID);
00262 __declspec(dllexport) const deDriverInfo *GetDriverInfo(long StructSize);
00263 };
00264
00265 #endif